import { reactive } from "vue"; // 引入 Vue 3 的 reactive
import WebSocketManager from "@/utils/websocket";

let websocketInstance = null; // 单例模式：确保只有一个 WebSocket 实例

export default {
  install(app, options) {
    if (websocketInstance) {
      console.warn("WebSocketManager 已经初始化，跳过重复初始化");
      return;
    }

    const url = options.url; // 默认 WebSocket URL
    const websocketManager = new WebSocketManager(url);

    // 使用 reactive 创建响应式状态
    const websocketState = reactive({
      manager: websocketManager,
      isInitialized: false,
    });

    // 挂载到 app.config.globalProperties 上（Vue 3 的全局挂载方式）
    app.config.globalProperties.$websocket = {
      state: websocketState,

      // 动态更新 WebSocket URL
      updateUrl(newUrl) {
        if (!newUrl) {
          console.error("WebSocket URL 不能为空");
          return;
        }
        websocketManager.url = newUrl; // 更新 URL
        console.log(`WebSocket URL 更新为: ${newUrl}`);
      },

      // 初始化 WebSocket 连接
      connect() {
        websocketManager.connect();
      },

      // 发送消息
      send(data) {
        if (
          websocketManager.socket &&
          websocketManager.socket.readyState === WebSocket.OPEN
        ) {
          websocketManager.send(data);
        } else {
          console.error("WebSocket 未连接，无法发送消息");
        }
      },

      // 添加事件监听器
      on(event, callback) {
        websocketManager.on(event, callback);
      },

      // 关闭 WebSocket 连接
      close() {
        websocketManager.close();
      },
    };

    // 初始化 WebSocket 连接
    websocketManager.connect();

    // 监听 WebSocket 的 "open" 事件，更新连接状态
    websocketManager.on("open", () => {
      websocketState.isInitialized = true;
      console.log("WebSocket 已连接");
    });

    // 监听 WebSocket 的 "close" 事件，更新连接状态
    websocketManager.on("close", () => {
      websocketState.isInitialized = false;
      console.log("WebSocket 已关闭");
    });

    // 监听 WebSocket 的 "error" 事件
    websocketManager.on("error", (error) => {
      console.error("WebSocket 错误:", error);
    });

    // 保存实例以防止重复初始化
    websocketInstance = websocketManager;
  },
};
